﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LM.InterfacesFabricas.DTOs;
using LM.Tela.Desktop.Properties;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;
using System.Globalization;

namespace LM.Tela.Desktop.Formularios
{
    public partial class frmCadastroDeEndereco : Form
    {
        public IList<DtoEndereco> ListEndereco { get; set; }
        public int RowIndex { get; set; }

        public frmCadastroDeEndereco()
        {
            InitializeComponent();
        }

        private void btnCancelar_Click( object sender, EventArgs e )
        {
            DialogResult result = MessageBox.Show(Resources.messageBox_dialog_exit, Resources.messageBox_title_Confirmação, MessageBoxButtons.YesNo, MessageBoxIcon.Information);
            if (result == DialogResult.Yes)
            {
                this.Close();
            } 
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            Salvar();
            CarregueItensJaCadastrados();
        }

        private void btnNovo_Click(object sender, EventArgs e)
        {
            PrepareTelaParaNovoRegistro();
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (!EmEdicao())
            {
                this.ExibaInconsistencia("Endereço não selecionada para edição.");
            }
            else
            {
                foreach (var c in ListEndereco.Where(c => c.Codigo == int.Parse(txtCodigo.Text)))
                {
                    ListEndereco.Remove(c);
                }

                PrepareTelaParaNovoRegistro();
                CarregueItensJaCadastrados();
            }
        }

        private void PrepareTelaParaNovoRegistro()
        {
            LimpeCamposEdicao();
            CarregueItensJaCadastrados();
            txtCodigo.Enabled = true;
            txtCodigo.Focus();
            dpdUf.SelectedIndex = 0;
        }

        private bool EmEdicao()
        {
            return !string.IsNullOrWhiteSpace(txtCodigo.Text) && txtCodigo.Enabled == false;
        }

        private void CarregueItensJaCadastrados()
        {
            grdEnderecos.DataSource = new List<DtoEndereco>();
            grdEnderecos.DataSource = ListEndereco;
        }

        private void LimpeCamposEdicao()
        {
            txtLogradouro.Text = string.Empty;
            txtCodigo.Text = string.Empty;
            txtNumero.Text = string.Empty;
            txtLote.Text = string.Empty;
            txtQuadra.Text = string.Empty;
            txtBairro.Text = string.Empty;
            txtComplemento.Text = string.Empty;
            txtCep.Text = string.Empty;
            txtCidade.Text = string.Empty;
            dpdUf.SelectedIndex = 0;
        }

        private void Salvar()
        {
            DtoEndereco d = new DtoEndereco();

            int codigo;
            int.TryParse(txtCodigo.Text, out codigo);
            var dependente = new DtoEndereco
            {
                Logradouro = txtLogradouro.Text,
                Codigo = codigo,
                Numero = Convert.ToInt32(txtNumero.Text),
                Lote = Convert.ToInt32(txtLote.Text),
                Quadra = txtQuadra.Text,
                Bairro = txtBairro.Text,
                Complemento = txtComplemento.Text,
                Cep = txtCep.Text,
                Cidade = txtCidade.Text,
                Uf = dpdUf.SelectedIndex.ToString()
            };

            var servicoDeDependente = FabricaGenerica.Crie<IServicoDeEndereco>();

            if (!EmEdicao())
            {
                d = servicoDeDependente.Valide(dependente);
                Cadastre(d);
            }
            else
                Atualize(dependente);

            PrepareTelaParaNovoRegistro();
        }

        private void Cadastre(DtoEndereco endereco)
        {
            ListEndereco.Add(endereco);
        }

        private void Atualize(DtoEndereco endereco)
        {
            ListEndereco[RowIndex] = endereco;
        }

        private void grdDependentes_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            RowIndex = e.RowIndex;
            if (e.RowIndex >= 0)
            {
                var endereco = ((IList<DtoEndereco>)grdEnderecos.DataSource)[e.RowIndex];

                txtCodigo.Text = endereco.Codigo.ToString(CultureInfo.InvariantCulture);
                txtCodigo.Enabled = false;
                txtLogradouro.Text = endereco.Logradouro;
                txtCodigo.Text = endereco.Codigo.ToString();
                txtNumero.Text = endereco.Numero.ToString();
                txtLote.Text = endereco.Lote.ToString();
                txtQuadra.Text = endereco.Quadra;
                txtBairro.Text = endereco.Bairro;
                txtComplemento.Text = endereco.Complemento;
                txtCep.Text = endereco.Cep;
                txtCidade.Text = endereco.Cidade;
                dpdUf.SelectedIndex = Convert.ToInt32(endereco.Uf);
            }
        }
    }
}
